#!/usr/bin/env node

const path = require('path');
const fs = require('fs-extra');

const targets = {
  dev:   'NODE_ENV=dev ./node_modules/.bin/vue-cli-service serve',
  build: './node_modules/.bin/vue-cli-service build',
  clean: './node_modules/@rancher/shell/scripts/clean'
};

const files = [
  'tsconfig.json',
  'vue.config.js',
  '.gitignore',
  '.eslintignore',
  '.eslintrc.js',
  'babel.config.js',
  '.vscode/settings.json'
];

console.log('');
console.log('Creating Skeleton Application');

const args = process.argv;
let appFolder = path.resolve('.');

if (args.length === 3) {
  const name = args[2];
  const folder = path.resolve('.');

  appFolder = path.join(folder, name);
  console.log(`  Creating application folder: ${ appFolder }`);
  fs.ensureDirSync(appFolder);
}

// Check that there is a package file

let setName = false;

if (!fs.existsSync(path.join(appFolder, './package.json'))) {
  console.log('  Adding package.json');
  fs.copySync(path.join(__dirname, 'app.package.json'), path.join(appFolder, 'package.json'));
  setName = true;
}

const rawdata = fs.readFileSync(path.join(appFolder, 'package.json'));
const pkg = JSON.parse(rawdata);

if (!pkg.scripts) {
  pkg.scripts = {};
}

if (setName) {
  const dirName = path.basename(appFolder);

  pkg.name = dirName;
}

Object.keys(targets).forEach((target) => {
  if (!pkg.scripts[target]) {
    pkg.scripts[target] = targets[target];
    console.log(`  Adding script '${ target }' to package.json`);
  }
});

// Add dependencies
// Use the same shell version as this app creator

const creatorPkgData = fs.readFileSync(path.join(__dirname, 'package.json'));
const creatorPkg = JSON.parse(creatorPkgData);

pkg.dependencies['@rancher/shell'] = `^${ creatorPkg.version }`;

// Rest of dependencies are in the _pkgs property of package.json - copy then across
if (creatorPkg._pkgs) {
  Object.keys(creatorPkg._pkgs).forEach((pkgName) => {
    pkg.dependencies[pkgName] = creatorPkg._pkgs[pkgName];
  });
}

fs.writeFileSync(path.join(appFolder, 'package.json'), JSON.stringify(pkg, null, 2));

// Copy base files
files.forEach((file) => {
  const src = path.join(__dirname, 'files', file);
  const dest = path.join(appFolder, file);

  if (!fs.existsSync(dest)) {
    console.log(`  Adding file: ${ file }`);

    const folder = path.dirname(file);

    fs.ensureDirSync(folder);

    // Create the folder if needed
    fs.copySync(src, dest);
  }
});

console.log('');
